package com.tp2.ui;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.MatteBorder;

import com.tp2.dao.ParserMediosDePago;
import com.tp2.dominio.Caja;
import com.tp2.dominio.Descuento;
import com.tp2.dominio.MedioDePago;
import com.tp2.dominio.Producto;
import com.tp2.dominio.TarjetaDescuento;

public class UICaja extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel panelContenedor;

	private DefaultListModel listaProductosIngresados;
	private DefaultListModel listaDescuentosIngresados;
	private JList listaDeProductos;
	private JList listaDeDescuentos;

	private JComboBox cbMedioDePago;
	private JComboBox cbMedioDePago2;

	private JScrollPane scrollPane1;
	private JScrollPane scrollPane2;

	private JTextField totalVentasBox;
	private JTextField totalDescuentosBox;
	private JTextField totalMedioDePago;
	private JTextField totalAPagar;
	private JTextField ingreso_Productos;
	private JTextField total_Descuentos;
	private JTextField total_Compra;

	private JButton btnAbrirCaja;
	private JButton btnCerrarCaja;
	private JButton btnAgregarProducto;
	private JButton btnIniciarVenta;
	private JButton btnConfirmarCompra;
	private JButton btnTotalVentas;
	private JButton btnTotalMedioDe;
	private JButton btnTerminarCompra;
	private JButton btnCancelarCompra;
	private JButton btnTotalDescuentos;
	private JButton btnLimpiarTotales;

	private JLabel lblIngreseElNombre;
	private JLabel lblProcesandoCompra;
	private JLabel lblSeleccioneMedioDe;
	private JLabel lblDescuentos;
	private JLabel lblTotalCompra;
	private JLabel lblTotalAPagar;
	private JLabel lblDetalleProductos;
	private JLabel lblTotalMedioDe;
	private JLabel lblDetalleDescuentosAplicados;
	private JLabel estadoCaja;
	private JLabel lblEstadoCambiante;

	private Caja caja;

	private JButton btnSalir;

	private JComboBox cbTarjetas;

	private JButton btnAgregarCupon;

	private JTextField ingreso_cupones;

	private JLabel lblIngreseCupon;

	public UICaja() {

		//TODO ver como hacemos para abrir varias cajas != desde la ui
		caja = new Caja(1, null);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("HyperMarket Caja");
		setResizable(false);
		setBounds(200, 200, 815, 530);

		panelContenedor = new JPanel();
		panelContenedor.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(panelContenedor);
		panelContenedor.setLayout(null);

		// Panel Superior

		btnAbrirCaja = new JButton("Abrir Caja");
		btnAbrirCaja.setBounds(25, 21, 150, 23);
		panelContenedor.add(btnAbrirCaja);

		btnCerrarCaja = new JButton("Cerrar Caja");
		btnCerrarCaja.setBounds(381, 21, 150, 23);
		panelContenedor.add(btnCerrarCaja);

		btnIniciarVenta = new JButton("Iniciar Venta");
		btnIniciarVenta.setBounds(206, 21, 150, 23);
		panelContenedor.add(btnIniciarVenta);

		btnAgregarProducto = new JButton("Agregar Producto");
		btnAgregarProducto.setBounds(29, 140, 150, 23);
		panelContenedor.add(btnAgregarProducto);

		ingreso_Productos = new JTextField();
		ingreso_Productos.setBounds(30, 113, 150, 20);
		panelContenedor.add(ingreso_Productos);
		ingreso_Productos.setColumns(10);

		lblIngreseElNombre = new JLabel("Ingrese codigo de producto");
		lblIngreseElNombre.setBounds(30, 90, 164, 14);
		panelContenedor.add(lblIngreseElNombre);

		lblProcesandoCompra = new JLabel("Procesando compra");
		lblProcesandoCompra.setBounds(31, 63, 139, 14);
		panelContenedor.add(lblProcesandoCompra);

		lblSeleccioneMedioDe = new JLabel("Seleccione medio de pago");
		lblSeleccioneMedioDe.setBounds(29, 293, 150, 14);
		panelContenedor.add(lblSeleccioneMedioDe);

		lblSeleccioneMedioDe = new JLabel("Seleccione descuentos");
		lblSeleccioneMedioDe.setBounds(29, 237, 150, 14);
		
		panelContenedor.add(lblSeleccioneMedioDe);
		cbMedioDePago = new JComboBox();
		cbMedioDePago.setBounds(29, 316, 150, 20);
		panelContenedor.add(cbMedioDePago);
		
		cbTarjetas = new JComboBox();
		cbTarjetas.setBounds(29, 260, 150, 20);
		panelContenedor.add(cbTarjetas);

		cbMedioDePago2 = new JComboBox();
		cbMedioDePago2.setBounds(633, 260, 150, 20);
		panelContenedor.add(cbMedioDePago2);

		ParserMediosDePago parser = new ParserMediosDePago();
		Collection<MedioDePago> mediosDePago = parser.getMediosDePago();

		for (MedioDePago medioDePago : mediosDePago) {

			cbMedioDePago.addItem(medioDePago.getNombre());
			cbMedioDePago2.addItem(medioDePago.getNombre());

		}

		Collection<TarjetaDescuento> tarjetas = parser.getTarjetasDeDescuento();
		
		for (TarjetaDescuento tarjeta : tarjetas) {

			cbTarjetas.addItem(tarjeta.getNombre());
			
		}
		
		lblDescuentos = new JLabel("Total Descuentos");
		lblDescuentos.setBounds(420, 395, 100, 14);
		panelContenedor.add(lblDescuentos);

		total_Descuentos = new JTextField();
		total_Descuentos.setEditable(false);
		total_Descuentos.setColumns(10);
		total_Descuentos.setBackground(Color.WHITE);
		total_Descuentos.setBounds(420, 410, 150, 20);
		panelContenedor.add(total_Descuentos);

		lblTotalCompra = new JLabel("Subtotal Compra");
		lblTotalCompra.setBounds(210, 395, 95, 14);
		panelContenedor.add(lblTotalCompra);

		total_Compra = new JTextField();
		total_Compra.setEditable(false);
		total_Compra.setColumns(10);
		total_Compra.setBackground(Color.WHITE);
		total_Compra.setBounds(210, 410, 152, 20);
		panelContenedor.add(total_Compra);

		btnConfirmarCompra = new JButton("Confirmar Compra");
		btnConfirmarCompra.setBounds(29, 348, 150, 23);
		panelContenedor.add(btnConfirmarCompra);

		lblDetalleProductos = new JLabel("Detalle compra");
		lblDetalleProductos.setBounds(210, 63, 150, 14);
		panelContenedor.add(lblDetalleProductos);

		lblDetalleDescuentosAplicados = new JLabel("Detalle descuentos");
		lblDetalleDescuentosAplicados.setBounds(420, 63, 150, 14);
		panelContenedor.add(lblDetalleDescuentosAplicados);

		listaProductosIngresados = new DefaultListModel();

		scrollPane1 = new JScrollPane();
		scrollPane1.setBounds(210, 89, 190, 282);
		panelContenedor.add(scrollPane1);
		listaDeProductos = new JList(listaProductosIngresados);
		scrollPane1.setViewportView(listaDeProductos);
		listaDeProductos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		listaDeProductos.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));

		listaDescuentosIngresados = new DefaultListModel();

		scrollPane2 = new JScrollPane();
		scrollPane2.setBounds(420, 89, 190, 282);
		panelContenedor.add(scrollPane2);
		listaDeDescuentos = new JList(listaDescuentosIngresados);
		scrollPane2.setViewportView(listaDeDescuentos);
		listaDeDescuentos.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));

		btnTotalVentas = new JButton("Total Ventas");
		btnTotalVentas.setBounds(633, 107, 150, 23);
		panelContenedor.add(btnTotalVentas);

		btnTotalDescuentos = new JButton("Total Descuentos");
		btnTotalDescuentos.setBounds(633, 165, 150, 23);
		panelContenedor.add(btnTotalDescuentos);

		totalVentasBox = new JTextField();
		totalVentasBox.setEditable(false);
		totalVentasBox.setColumns(10);
		totalVentasBox.setBackground(Color.WHITE);
		totalVentasBox.setBounds(633, 138, 150, 20);
		panelContenedor.add(totalVentasBox);

		totalDescuentosBox = new JTextField();
		totalDescuentosBox.setEditable(false);
		totalDescuentosBox.setColumns(10);
		totalDescuentosBox.setBackground(Color.WHITE);
		totalDescuentosBox.setBounds(633, 198, 150, 20);
		panelContenedor.add(totalDescuentosBox);

		lblTotalMedioDe = new JLabel("Seleccione medio de pago");
		lblTotalMedioDe.setBounds(633, 240, 150, 14);
		panelContenedor.add(lblTotalMedioDe);

		btnTotalMedioDe = new JButton("Total Medio de Pago");
		btnTotalMedioDe.setBounds(633, 291, 150, 23);
		panelContenedor.add(btnTotalMedioDe);

		totalMedioDePago = new JTextField();
		totalMedioDePago.setEditable(false);
		totalMedioDePago.setColumns(10);
		totalMedioDePago.setBackground(Color.WHITE);
		totalMedioDePago.setBounds(633, 323, 150, 20);
		panelContenedor.add(totalMedioDePago);

		btnTerminarCompra = new JButton("Terminar Compra");
		btnTerminarCompra.setBounds(29, 450, 152, 23);
		panelContenedor.add(btnTerminarCompra);

		lblTotalAPagar = new JLabel("Total a Pagar");
		lblTotalAPagar.setBounds(29, 395, 89, 14);
		panelContenedor.add(lblTotalAPagar);

		totalAPagar = new JTextField();
		totalAPagar.setEditable(false);
		totalAPagar.setColumns(10);
		totalAPagar.setBackground(Color.WHITE);
		totalAPagar.setBounds(29, 410, 152, 20);
		panelContenedor.add(totalAPagar);

		btnCancelarCompra = new JButton("Cancelar Compra");
		btnCancelarCompra.setBounds(210, 450, 150, 23);
		panelContenedor.add(btnCancelarCompra);

		estadoCaja = new JLabel("ESTADO: ");
		estadoCaja.setBounds(557, 25, 79, 14);
		panelContenedor.add(estadoCaja);

		lblEstadoCambiante = new JLabel(caja.getEstado());
		lblEstadoCambiante.setBounds(619, 25, 150, 14);
		panelContenedor.add(lblEstadoCambiante);

		btnLimpiarTotales = new JButton("Limpiar Totales");
		btnLimpiarTotales.setBounds(633, 371, 150, 23);
		panelContenedor.add(btnLimpiarTotales);
		
		btnSalir = new JButton("Salir");
		btnSalir.setBounds(633, 450, 150, 23);
		panelContenedor.add(btnSalir);

		//AGREGAR CUPON
		
		btnAgregarCupon = new JButton("Agregar Cupon");
		btnAgregarCupon.setBounds(29, 210, 150, 23);
		panelContenedor.add(btnAgregarCupon);

		ingreso_cupones = new JTextField();
		ingreso_cupones.setBounds(30, 185, 150, 20);
		panelContenedor.add(ingreso_cupones);
		ingreso_cupones.setColumns(10);

		lblIngreseCupon = new JLabel("Ingrese codigo de cupon");
		lblIngreseCupon.setBounds(30, 170, 164, 14);
		panelContenedor.add(lblIngreseCupon);
		
		acciones();

	}

	private void mostrarError(Exception e) {

		JOptionPane.showMessageDialog(null, e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);

	}

	private void vaciarTextBoxes() {

		totalAPagar.setText("");
		ingreso_Productos.setText("");
		ingreso_cupones.setText("");
		total_Descuentos.setText("");
		total_Compra.setText("");
		
		totalVentasBox.setText("");
		totalDescuentosBox.setText("");
		totalMedioDePago.setText("");

		listaDescuentosIngresados.clear();
		listaProductosIngresados.clear();

		cbMedioDePago.setSelectedIndex(0);

		lblEstadoCambiante.setText(caja.getEstado());

	}

	public void acciones() {

		btnAbrirCaja.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				caja.abrir();
				lblEstadoCambiante.setText(caja.getEstado());

			}
		});

		btnIniciarVenta.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				try {
					caja.iniciarCompra();

				} catch (Exception e1) {
					mostrarError(e1);
					return;
				}

				lblEstadoCambiante.setText(caja.getEstado());

			}
		});

		btnAgregarProducto.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				if (!ingreso_Productos.getText().isEmpty()) {

					Producto producto;
					try {
						producto = caja.agregarProducto(ingreso_Productos.getText());
					} catch (Exception e) {
						mostrarError(e);
						ingreso_Productos.setText("");
						return;
					}

					total_Compra.setText("$ "
							+ Double.toString(caja.getTicketActual().getSubtotal()));
					String itemLista = (producto.getNombre()) + "       $ "
							+ Double.toString(producto.getPrecio());
					listaProductosIngresados.addElement(itemLista);
					ingreso_Productos.setText("");

				}
			}
		});
		
		btnAgregarCupon.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				if (!ingreso_cupones.getText().isEmpty()) {

					String descripcion;
					
					try {
						descripcion = caja.agregarCupon(ingreso_cupones.getText());
					} catch (Exception e) {
						mostrarError(e);
						ingreso_cupones.setText("");
						return;
					}

					ingreso_cupones.setText(ingreso_cupones.getText() + " "+ descripcion);

				}
			}
		});

		btnConfirmarCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				try {
					TarjetaDescuento tarjeta = null;
					if (!cbTarjetas.getSelectedItem().toString().equalsIgnoreCase("Tarjetas descuento"))
						tarjeta = new TarjetaDescuento(cbTarjetas.getSelectedItem().toString());
					caja.confirmarCompra(new MedioDePago(cbMedioDePago.getSelectedItem().toString()), tarjeta);

				} catch (Exception e1) {
					mostrarError(e1);
					return;
				}

				totalAPagar.setText("$ " + Double.toString(caja.getTicketActual().getTotal()));

				Collection<Descuento> descuentos = caja.getTicketActual().getDescuentos();

				for (Descuento descuento : descuentos) {
					String itemLista = (descuento.getDescripcion() + "     $ " + Double
							.toString(descuento.getMonto()));
					listaDescuentosIngresados.addElement(itemLista);

				}

				total_Descuentos.setText("$ "
						+ Double.toString(caja.getTicketActual().getTotalDescuentos()));
			}
		});

		btnTerminarCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				try {
					caja.terminarCompra();
				} catch (Exception e1) {

					mostrarError(e1);
					return;
				}

				vaciarTextBoxes();

			}

		});

		btnCancelarCompra.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				caja.cancelarCompra();
				vaciarTextBoxes();
			}
		});

		btnTotalVentas.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				if (!caja.getEstado().equalsIgnoreCase("cerrada"))
					totalVentasBox.setText("$ " + Double.toString(caja.getTotalVentas()));

			}
		});

		btnTotalDescuentos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				if (!caja.getEstado().equalsIgnoreCase("cerrada"))
					totalDescuentosBox.setText("$ "
							+ Double.toString(caja.getTotalDescuentosOrtogados()));

			}
		});

		btnTotalMedioDe.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				if (!caja.getEstado().equalsIgnoreCase("cerrada")) {
					String medioDePagoSeleccionado = cbMedioDePago2.getSelectedItem().toString();
					totalMedioDePago.setText("$ "
							+ Double.toString(caja.getTotalMedioDePago(new MedioDePago(
									medioDePagoSeleccionado))));
				}
			}
		});

		btnCerrarCaja.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					caja.cerrar();
				} catch (Exception e1) {
					mostrarError(e1);
					return;
				}
				vaciarTextBoxes();
			}
		});

		btnLimpiarTotales.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				totalVentasBox.setText("");
				totalDescuentosBox.setText("");
				totalMedioDePago.setText("");

				cbMedioDePago2.setSelectedIndex(0);
			}
		});
		
		btnSalir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

	}

	/**
	 * Lanza el Frame
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					UICaja frame = new UICaja();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}
